package studio.xiaoyun.core.dao;

import java.util.List;

/**
 * 定义一些通用的DAO层方法
 * @param <T> 实现该接口时需要指定具体的实体类
 * @param <V> 主键类型
 */
public interface IBaseDao <T,V>{
	
	/**
	 * 删除数据。
	 * <p>注意：该方法会从数据库中删除数据，但是缓存中可能还存在，如果想删除缓存中的数据，请使用session.flush();session.clear();
	 * @param entitys 实体
	 */
	public void delete(List<T> entitys);
	
	/**
	 * 删除数据
	 * @param entity 实体
	 */
	public void delete(T entity);
	
	/**
	 * 删除数据。
	 * <p>注意：该方法会从数据库中删除数据，但是缓存中可能还存在，如果想删除缓存中的数据，请使用session.flush();session.clear();
	 * @param IDs 主键
	 */
	public void deleteByID(List<V> IDs);
	
	/**
	 * 删除数据
	 * @param ID 主键
	 */
	public void deleteByID(V ID);
	
	/**
	 * 根据ID获得实体。
	 * <p>会直接从数据库中查询数据，如果ID对应的实体不存在，则返回null
	 * @param ID 主键
	 * @return 实体
	 */
	public T getByID(V ID);
	
	/**
	 * 根据ID获得实体的代理对象。
	 * <p>只获得代理对象，在需要数据时才会查询数据库，如果ID对应的实体不存在，则抛出异常，代理对象只能在事务范围内使用
	 * @param ID 主键
	 * @return ID对应实体的代理对象
	 */
	public T loadByID(V ID);
	
	/**
	 * 保存实体
	 * @param entitys 实体类
	 * @return 实体类的ID
	 */
	public List<V> save(List<T> entitys);
	
	/**
	 * 保存实体
	 * @param entity 实体类
	 * @return 实体类的ID
	 */
	public V save(T entity);
	
	/**
	 * 更新实体
	 * @param entitys 实体
	 */
	public void update(List<T> entitys);
	
	/**
	 * 更新实体
	 * @param entity 实体
	 */ 
	public void update(T entity);
	
}
